import re

import scrapy
# 需求 爬取每一个一级目录的二级目录数据
# 方案 声明回调函数 专门向二级目录发送请求 进行数据清洗 结合之前的 数据 进行链接保存
#
"""
1通过scrapy框架 爬取豆瓣翻页数据
2要求
    2.1保存为json格式数据
    2.2要五个字段   # 标题   # 链接    #评分    #简评  #二级目录的简评
    2.3记得调试过程中 加上time.time()
3截图
    3.1json格式文件
    3.2看回调函数

提示 每一页的数据提取方式是一样的
2203-第九次作业-xx真名

作业讲解的思路 
因为每一页的所有字段提取方式都是一样的 所以可以通过直接匹配下一页的url来回调 parse方法 

详细步骤 
1.在每页循环爬取完的url后面 加上匹配下一页的url语法 
2直接拿着第二页的url回调parse方法 
"""
import time
from ..items import *
class Douban2Spider(scrapy.Spider):
    name = 'douban2'
    allowed_domains = ['douban.com']
    start_urls = ['https://movie.douban.com/top250']
    def parse(self, response):
        # 获取整页的数据   获取共同节点 节点遍历 字段爬取  25个电影的共同节点
        # 注意 如果刻意获取节点不需要加上.get进行提取
        nodes=response.xpath('//div[@class="info"]')
        # 遍历 nodes
        for node in nodes:
            title=node.xpath('./div[1]/a/span[1]/text()').getall()
            # 链接
            link=node.xpath('./div[1]/a/@href').getall()
            # 评分
            score=node.xpath('./div[2]/div[1]/span[2]/text()').get()
            # 简评
            content=node.xpath('./div[2]/p[2]/span/text()').getall()
            if content ==[]:
                content=["电影没有影评!"]
            item=Douban2502Item()
            item["title"]=title[0]
            item["link"]=link[0]
            item["score"]=score
            item["content"]=content[0]
            print(item)
            # 这是scrapy模块的回调函数使用方法 至少传递两个参数  1url 2指定回调方法  3meta字典（传递item）
            # 注意指定回调方法不要加括号
            # demo自定义
            yield scrapy.Request(link[0],callback=self.second_parse,meta={"初识NLTK.py":item})
        #注意点 需要在25个电影爬取完再进行第二页url匹配
        self.next_url=response.xpath('//*[@id="content"]/div/div[1]/div[2]/span[3]/link/@href').getall()
        # 不等于[]表示有下一页的url  进行回调
        if self.next_url!=[]:
            # 注意url是残缺的 需要进行拼接?start=225&filter=
            self.next_url="https://movie.douban.com/top250"+self.next_url[0]
            yield scrapy.Request(url=self.next_url,callback=self.parse)
        else:
            print("没有下一页了!")
        time.sleep(2)
    #   自定义回调方法
    def second_parse(self,response):
        print(response.text)
        item=response.meta.get("初识NLTK.py")  #不会有meta.get("初识NLTK.py")提示
        contentsss=re.findall('<span property="v:summary".*?>(.*?)</span>',response.text,re.S)
        item["contentsss"]=contentsss
        return item





